Skip to content

Conversation

@clin1234
Copy link
Contributor

@clin1234 clin1234 commented Nov 22, 2025

Followup to #472

@Yhg1s, mind taking a look?

Yhg1s and others added 7 commits November 22, 2025 23:14
The significant change here is the use of thread local instead of a volatile
global for the switching_thread_state global (which is otherwise protected
by the GIL). There's some overhead to using a thread local, so only do this
in the free-threaded build.

The only other two bits of shared mutable data are `G_TOTAL_MAIN_GREENLETS
and ThreadState::clocks_used_during_gc. Modify the latter to use a
std::atomic with relaxed memory order, which should be good enough, and
performance probably matters for those updates.

For G_MAIN_TOTAL_GREENLETS, switch to a std::atomic without changing the
inc/dec operations (which means they use sequential consistency), because
they're rare enough that performance doesn't really matter.

Also mark the main extension modules and the two test extensions as
supporting free-threading (without switching to multi-phase init). The GIL
will still temporarily be enabled during module import, but that probably
won't matter (modules are usually imported before starting threads). If it
does, switching to multi-phase init is always an option.

The existing test suite cover threads extensively enough that no extra tests
are necessary. There is an intermittent failure (<0.2% of runs) that shows
up when running the testsuite in a tight loop, but this happens in regular
Python builds (and before 3.14) too. ThreadSanitizer can't be used on
greenlet, from what I can tell because of how it gets confused by the stack
switching. This is the case for GILful Python builds as well.
As of 3.15a2, FRAME_OWNED_BY_CSTACK has been removed
@jamadden jamadden closed this Nov 22, 2025
@clin1234
Copy link
Contributor Author

With the following command (running with 3.15t from deadsnakes):

(venv) @clin1234 ➜ /workspaces/greenlet (master) $ python -m unittest discover greenlet.tests -c --locals -v
test_break_ctxvars (greenlet.tests.test_contextvars.ContextVarsTests.test_break_ctxvars) ... ok
test_context_assignment_different_thread (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_different_thread) ... ok
test_context_assignment_while_running (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_while_running) ... ok
test_context_assignment_wrong_type (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_wrong_type) ... ok
test_context_not_propagated (greenlet.tests.test_contextvars.ContextVarsTests.test_context_not_propagated) ... ok
test_context_propagated_by_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_context_run) ... ok
test_context_propagated_by_setting_attribute (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_setting_attribute) ... ok
test_context_shared (greenlet.tests.test_contextvars.ContextVarsTests.test_context_shared) ... ok
test_not_broken_if_using_attribute_instead_of_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_run) ... ok
test_contextvars_errors (greenlet.tests.test_contextvars.NoContextVarsTests.test_contextvars_errors) ... skipped 'ContextVar supported'
test_exception_switch (greenlet.tests.test_cpp.CPPTests.test_exception_switch) ... ok
test_unhandled_exception_in_greenlet_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts) ... ok
test_unhandled_nonstd_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_nonstd_exception_aborts) ... ok
test_unhandled_std_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_aborts) ... ok
test_unhandled_std_exception_as_greenlet_function_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_as_greenlet_function_aborts) ... ok
test_getcurrent (greenlet.tests.test_extension_interface.CAPITests.test_getcurrent) ... ok
test_instance_of_wrong_type (greenlet.tests.test_extension_interface.CAPITests.test_instance_of_wrong_type) ... ok
test_new_greenlet (greenlet.tests.test_extension_interface.CAPITests.test_new_greenlet) ... ok
test_non_traceback_param (greenlet.tests.test_extension_interface.CAPITests.test_non_traceback_param) ... ok
test_not_throwable (greenlet.tests.test_extension_interface.CAPITests.test_not_throwable) ... ok
test_raise_greenlet_dead (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_dead) ... ok
test_raise_greenlet_error (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_error) ... ok
test_setparent (greenlet.tests.test_extension_interface.CAPITests.test_setparent) ... ok
test_switch (greenlet.tests.test_extension_interface.CAPITests.test_switch) ... ok
test_switch_kwargs (greenlet.tests.test_extension_interface.CAPITests.test_switch_kwargs) ... ok
test_throw (greenlet.tests.test_extension_interface.CAPITests.test_throw) ... ok
test_circular_greenlet (greenlet.tests.test_gc.GCTests.test_circular_greenlet) ... ok
test_dead_circular_ref (greenlet.tests.test_gc.GCTests.test_dead_circular_ref) ... ok
test_finalizer_crash (greenlet.tests.test_gc.GCTests.test_finalizer_crash) ... ok
test_inactive_ref (greenlet.tests.test_gc.GCTests.test_inactive_ref) ... ok
test_generator (greenlet.tests.test_generator.GeneratorTests.test_generator) ... ok
test_genlet_bad (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_bad) ... ok
test_genlet_simple (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_simple) ... ok
test_layered_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_layered_genlets) ... ok
test_nested_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_nested_genlets) ... ok
test_permutations (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_permutations) ... ok
test_failed_to_initialstub (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_initialstub) ... ok
test_failed_to_slp_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running) ... ok
test_failed_to_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_switch_into_running) ... ok
test_reentrant_switch_GreenletAlreadyStartedInPython (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython) ... ok
test_reentrant_switch_run_callable_has_del (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del) ... ok
test_reentrant_switch_three_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets) ... ok
test_reentrant_switch_three_greenlets2 (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets2) ... ok
test_reentrant_switch_two_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_two_greenlets) ... ok
test_abstract_subclasses (greenlet.tests.test_greenlet.TestGreenlet.test_abstract_subclasses) ... ok
test_can_access_f_back_of_suspended_greenlet (greenlet.tests.test_greenlet.TestGreenlet.test_can_access_f_back_of_suspended_greenlet) ... ok
test_dealloc (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc) ... ok
test_dealloc_catches_GreenletExit_throws_other (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_catches_GreenletExit_throws_other) ... ok
test_dealloc_other_thread (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_other_thread) ... ok
test_dealloc_switch_args_not_lost (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_switch_args_not_lost) ... ok
test_deepcopy (greenlet.tests.test_greenlet.TestGreenlet.test_deepcopy) ... ok
test_exc_state (greenlet.tests.test_greenlet.TestGreenlet.test_exc_state) ... ok
test_exception (greenlet.tests.test_greenlet.TestGreenlet.test_exception) ... ok
test_falling_off_end_switches_to_unstarted_parent_raises_error (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error) ... ok
test_falling_off_end_switches_to_unstarted_parent_works (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works) ... ok
test_frame (greenlet.tests.test_greenlet.TestGreenlet.test_frame) ... ok
test_frames_always_exposed (greenlet.tests.test_greenlet.TestGreenlet.test_frames_always_exposed) ... ok
test_get_stack_with_nested_c_calls (greenlet.tests.test_greenlet.TestGreenlet.test_get_stack_with_nested_c_calls) ... ok
test_implicit_parent_with_threads (greenlet.tests.test_greenlet.TestGreenlet.test_implicit_parent_with_threads) ... ok
test_instance_dict (greenlet.tests.test_greenlet.TestGreenlet.test_instance_dict) ... ok
test_issue_245_reference_counting_subclass_no_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_no_threads) ... ok
test_issue_245_reference_counting_subclass_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_threads) ... Segmentation fault (core dumped)

@clin1234
Copy link
Contributor Author

With gdb:

(venv) @clin1234 ➜ /workspaces/greenlet (master) $ gdb --args python -m unittest discover -v greenlet.tests -c --locals
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python...

This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.ubuntu.com>
Enable debuginfod for this session? (y or [n]) 
Debuginfod has been disabled.
To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit.
(No debugging symbols found in python)
(gdb) r
Starting program: /workspaces/venv/bin/python -m unittest discover -v greenlet.tests -c --locals
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
test_break_ctxvars (greenlet.tests.test_contextvars.ContextVarsTests.test_break_ctxvars) ... ok
test_context_assignment_different_thread (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_different_thread) ... [New Thread 0x7ffff75146c0 (LWP 53676)]
[Thread 0x7ffff75146c0 (LWP 53676) exited]
[New Thread 0x7ffff75146c0 (LWP 53677)]
[Thread 0x7ffff75146c0 (LWP 53677) exited]
[New Thread 0x7ffff75146c0 (LWP 53678)]
[Thread 0x7ffff75146c0 (LWP 53678) exited]
ok
test_context_assignment_while_running (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_while_running) ... ok
test_context_assignment_wrong_type (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_wrong_type) ... ok
test_context_not_propagated (greenlet.tests.test_contextvars.ContextVarsTests.test_context_not_propagated) ... ok
test_context_propagated_by_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_context_run) ... ok
test_context_propagated_by_setting_attribute (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_setting_attribute) ... ok
test_context_shared (greenlet.tests.test_contextvars.ContextVarsTests.test_context_shared) ... ok
test_not_broken_if_using_attribute_instead_of_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_run) ... ok
test_contextvars_errors (greenlet.tests.test_contextvars.NoContextVarsTests.test_contextvars_errors) ... skipped 'ContextVar supported'
test_exception_switch (greenlet.tests.test_cpp.CPPTests.test_exception_switch) ... ok
test_unhandled_exception_in_greenlet_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts) ... [Detaching after vfork from child process 53751]
[Detaching after vfork from child process 53752]
[Detaching after vfork from child process 53753]
ok
test_unhandled_nonstd_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_nonstd_exception_aborts) ... [Detaching after vfork from child process 53762]
[Detaching after vfork from child process 53769]
[Detaching after vfork from child process 53770]
ok
test_unhandled_std_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_aborts) ... [Detaching after vfork from child process 53771]
[Detaching after vfork from child process 53773]
[Detaching after vfork from child process 53774]
ok
test_unhandled_std_exception_as_greenlet_function_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_as_greenlet_function_aborts) ... [Detaching after vfork from child process 53775]
[Detaching after vfork from child process 53776]
[Detaching after vfork from child process 53777]
ok
test_getcurrent (greenlet.tests.test_extension_interface.CAPITests.test_getcurrent) ... ok
test_instance_of_wrong_type (greenlet.tests.test_extension_interface.CAPITests.test_instance_of_wrong_type) ... ok
test_new_greenlet (greenlet.tests.test_extension_interface.CAPITests.test_new_greenlet) ... ok
test_non_traceback_param (greenlet.tests.test_extension_interface.CAPITests.test_non_traceback_param) ... ok
test_not_throwable (greenlet.tests.test_extension_interface.CAPITests.test_not_throwable) ... ok
test_raise_greenlet_dead (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_dead) ... ok
test_raise_greenlet_error (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_error) ... ok
test_setparent (greenlet.tests.test_extension_interface.CAPITests.test_setparent) ... ok
test_switch (greenlet.tests.test_extension_interface.CAPITests.test_switch) ... ok
test_switch_kwargs (greenlet.tests.test_extension_interface.CAPITests.test_switch_kwargs) ... ok
test_throw (greenlet.tests.test_extension_interface.CAPITests.test_throw) ... ok
test_circular_greenlet (greenlet.tests.test_gc.GCTests.test_circular_greenlet) ... ok
test_dead_circular_ref (greenlet.tests.test_gc.GCTests.test_dead_circular_ref) ... ok
test_finalizer_crash (greenlet.tests.test_gc.GCTests.test_finalizer_crash) ... ok
test_inactive_ref (greenlet.tests.test_gc.GCTests.test_inactive_ref) ... ok
test_generator (greenlet.tests.test_generator.GeneratorTests.test_generator) ... ok
test_genlet_bad (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_bad) ... ok
test_genlet_simple (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_simple) ... ok
test_layered_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_layered_genlets) ... ok
test_nested_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_nested_genlets) ... ok
test_permutations (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_permutations) ... ok
test_failed_to_initialstub (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_initialstub) ... ok
test_failed_to_slp_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running) ... [Detaching after vfork from child process 53817]
[Detaching after vfork from child process 53818]
[Detaching after vfork from child process 53819]
ok
test_failed_to_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_switch_into_running) ... ok
test_reentrant_switch_GreenletAlreadyStartedInPython (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython) ... [Detaching after vfork from child process 53820]
[Detaching after vfork from child process 53822]
[Detaching after vfork from child process 53823]
ok
test_reentrant_switch_run_callable_has_del (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del) ... [Detaching after vfork from child process 53824]
[Detaching after vfork from child process 53825]
[Detaching after vfork from child process 53826]
ok
test_reentrant_switch_three_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets) ... [Detaching after vfork from child process 53827]
[Detaching after vfork from child process 53834]
[Detaching after vfork from child process 53835]
ok
test_reentrant_switch_three_greenlets2 (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets2) ... [Detaching after vfork from child process 53836]
[Detaching after vfork from child process 53837]
[Detaching after vfork from child process 53838]
ok
test_reentrant_switch_two_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_two_greenlets) ... [Detaching after vfork from child process 53839]
[Detaching after vfork from child process 53840]
[Detaching after vfork from child process 53842]
ok
test_abstract_subclasses (greenlet.tests.test_greenlet.TestGreenlet.test_abstract_subclasses) ... ok
test_can_access_f_back_of_suspended_greenlet (greenlet.tests.test_greenlet.TestGreenlet.test_can_access_f_back_of_suspended_greenlet) ... ok
test_dealloc (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc) ... ok
test_dealloc_catches_GreenletExit_throws_other (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_catches_GreenletExit_throws_other) ... ok
test_dealloc_other_thread (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_other_thread) ... [New Thread 0x7ffff75146c0 (LWP 53861)]
[Thread 0x7ffff75146c0 (LWP 53861) exited]
[New Thread 0x7ffff75146c0 (LWP 53862)]
[Thread 0x7ffff75146c0 (LWP 53862) exited]
[New Thread 0x7ffff75146c0 (LWP 53863)]
[Thread 0x7ffff75146c0 (LWP 53863) exited]
ok
test_dealloc_switch_args_not_lost (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_switch_args_not_lost) ... ok
test_deepcopy (greenlet.tests.test_greenlet.TestGreenlet.test_deepcopy) ... ok
test_exc_state (greenlet.tests.test_greenlet.TestGreenlet.test_exc_state) ... ok
test_exception (greenlet.tests.test_greenlet.TestGreenlet.test_exception) ... ok
test_falling_off_end_switches_to_unstarted_parent_raises_error (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error) ... ok
test_falling_off_end_switches_to_unstarted_parent_works (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works) ... ok
test_frame (greenlet.tests.test_greenlet.TestGreenlet.test_frame) ... ok
test_frames_always_exposed (greenlet.tests.test_greenlet.TestGreenlet.test_frames_always_exposed) ... ok
test_get_stack_with_nested_c_calls (greenlet.tests.test_greenlet.TestGreenlet.test_get_stack_with_nested_c_calls) ... ok
test_implicit_parent_with_threads (greenlet.tests.test_greenlet.TestGreenlet.test_implicit_parent_with_threads) ... ok
test_instance_dict (greenlet.tests.test_greenlet.TestGreenlet.test_instance_dict) ... ok
test_issue_245_reference_counting_subclass_no_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_no_threads) ... ok
test_issue_245_reference_counting_subclass_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_threads) ... [New Thread 0x7ffff75146c0 (LWP 53888)]
[New Thread 0x7ffff6ccf6c0 (LWP 53889)]
[New Thread 0x7ffff64c26c0 (LWP 53890)]
[New Thread 0x7ffff5cb96c0 (LWP 53891)]
[New Thread 0x7ffff54b06c0 (LWP 53892)]
[New Thread 0x7ffff4ca76c0 (LWP 53893)]
[New Thread 0x7fffdffff6c0 (LWP 53894)]
[New Thread 0x7fffdf7fe6c0 (LWP 53895)]
[New Thread 0x7fffdeffd6c0 (LWP 53896)]
[New Thread 0x7fffde7fc6c0 (LWP 53897)]
[New Thread 0x7fffddffb6c0 (LWP 53898)]
[New Thread 0x7fffdd7fa6c0 (LWP 53899)]
[New Thread 0x7fffdcff96c0 (LWP 53900)]
[New Thread 0x7fffbbfff6c0 (LWP 53901)]
[New Thread 0x7fffbb7fe6c0 (LWP 53902)]
[New Thread 0x7fffbaffd6c0 (LWP 53903)]
[New Thread 0x7fffba7fc6c0 (LWP 53904)]
[New Thread 0x7fffb9ffb6c0 (LWP 53905)]
[New Thread 0x7fffb97fa6c0 (LWP 53906)]
[New Thread 0x7fffb8ff96c0 (LWP 53907)]
[New Thread 0x7fffb3fff6c0 (LWP 53908)]
[New Thread 0x7fffb37fe6c0 (LWP 53909)]
[New Thread 0x7fffb2ffd6c0 (LWP 53910)]
[New Thread 0x7fffb27fc6c0 (LWP 53911)]
[New Thread 0x7fffb1ffb6c0 (LWP 53912)]
[New Thread 0x7fffb17fa6c0 (LWP 53913)]
[New Thread 0x7fffb0ff96c0 (LWP 53914)]
[New Thread 0x7fffabfff6c0 (LWP 53915)]
[New Thread 0x7fffab7fe6c0 (LWP 53916)]
[New Thread 0x7fffaaffd6c0 (LWP 53917)]
[New Thread 0x7fffaa7fc6c0 (LWP 53918)]
[New Thread 0x7fffa9ffb6c0 (LWP 53919)]
[New Thread 0x7fffa97fa6c0 (LWP 53920)]
[New Thread 0x7fffa8ff96c0 (LWP 53921)]
[New Thread 0x7fffa87f86c0 (LWP 53922)]
[New Thread 0x7fffa7ff76c0 (LWP 53923)]
[New Thread 0x7fffa77f66c0 (LWP 53924)]
[New Thread 0x7fffa6ff56c0 (LWP 53925)]
[New Thread 0x7fffa67f46c0 (LWP 53926)]
[New Thread 0x7fffa5ff36c0 (LWP 53927)]
[New Thread 0x7fffa57f26c0 (LWP 53928)]
[New Thread 0x7fffa4ff16c0 (LWP 53929)]
[New Thread 0x7fffa47f06c0 (LWP 53930)]
[New Thread 0x7fffa3fef6c0 (LWP 53931)]
[New Thread 0x7fffa37ee6c0 (LWP 53932)]
[New Thread 0x7fffa2fed6c0 (LWP 53933)]
[New Thread 0x7fffa27ec6c0 (LWP 53934)]
[New Thread 0x7fffa1feb6c0 (LWP 53935)]
[New Thread 0x7fffa17ea6c0 (LWP 53936)]
[New Thread 0x7fffa0fe96c0 (LWP 53937)]
Fatal Python error: _Py_CheckRecursiveCall: Unrecoverable stack overflow (used 1332012 kB) while getting the repr of an obj
Python runtime state: initialized

Stack (most recent call first):
[Thread 0x7fffde7fc6c0 (LWP 53897) exited]
[Thread 0x7fffa0fe96c0 (LWP 53937) exited]
[Thread 0x7fffa1feb6c0 (LWP 53935) exited]
[Thread 0x7fffa37ee6c0 (LWP 53932) exited]
[Thread 0x7fffa3fef6c0 (LWP 53931) exited]
[Thread 0x7fffa4ff16c0 (LWP 53929) exited]
[Thread 0x7fffa57f26c0 (LWP 53928) exited]
[Thread 0x7fffa5ff36c0 (LWP 53927) exited]
[Thread 0x7fffa7ff76c0 (LWP 53923) exited]
[Thread 0x7fffa97fa6c0 (LWP 53920) exited]
[Thread 0x7fffab7fe6c0 (LWP 53916) exited]
[Thread 0x7fffb0ff96c0 (LWP 53914) exited]
[Thread 0x7fffb17fa6c0 (LWP 53913) exited]
[Thread 0x7fffb1ffb6c0 (LWP 53912) exited]
[Thread 0x7fffb37fe6c0 (LWP 53909) exited]
[Thread 0x7fffb3fff6c0 (LWP 53908) exited]
[Thread 0x7fffb8ff96c0 (LWP 53907) exited]
[Thread 0x7fffb9ffb6c0 (LWP 53905) exited]
[Thread 0x7fffba7fc6c0 (LWP 53904) exited]
[Thread 0x7fffbaffd6c0 (LWP 53903) exited]
[Thread 0x7fffbbfff6c0 (LWP 53901) exited]
[Thread 0x7fffdcff96c0 (LWP 53900) exited]
[Thread 0x7ffff54b06c0 (LWP 53892) exited]
[Thread 0x7ffff64c26c0 (LWP 53890) exited]
[Thread 0x7ffff6ccf6c0 (LWP 53889) exited]
[Thread 0x7fffaa7fc6c0 (LWP 53918) exited]
[Thread 0x7ffff75146c0 (LWP 53888) exited]
[Thread 0x7fffdeffd6c0 (LWP 53896) exited]
[Thread 0x7fffaaffd6c0 (LWP 53917) exited]
[Thread 0x7fffa9ffb6c0 (LWP 53919) exited]
[Thread 0x7fffa17ea6c0 (LWP 53936) exited]

Thread 41 "Thread-40 (thre" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffa8ff96c0 (LWP 53921)]
0x00007ffff77ee76b in slp_switch () at src/greenlet/platform/switch_amd64_unix.h:58
58              SLP_SAVE_STATE(stackref, stsizediff);
(gdb) info threads
  Id   Target Id                                           Frame 
  1    Thread 0x7ffff7c70080 (LWP 53668) "python"          0x00007ffff7d5dadf in __GI___clock_nanosleep (clock_id=1, flags=1, 
    req=0x7fffffff93a0, rem=0x0) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78
  11   Thread 0x7ffff5cb96c0 (LWP 53891) "Thread-10 (thre" 0x0000000000683867 in ?? ()
  13   Thread 0x7ffff4ca76c0 (LWP 53893) "Thread-12 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  14   Thread 0x7fffdffff6c0 (LWP 53894) "Thread-13 (thre" 0x00000000007f2d19 in ?? ()
  15   Thread 0x7fffdf7fe6c0 (LWP 53895) "Thread-14 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  18   Thread 0x7fffddffb6c0 (LWP 53898) "Thread-17 (thre" 0x0000000000661e10 in PyThreadState_GetFrame ()
  19   Thread 0x7fffdd7fa6c0 (LWP 53899) "Thread-18 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  22   Thread 0x7fffbb7fe6c0 (LWP 53902) "Thread-21 (thre" __pthread_kill_implementation (no_tid=0, signo=6, 
    threadid=<optimized out>) at ./nptl/pthread_kill.c:44
  26   Thread 0x7fffb97fa6c0 (LWP 53906) "Thread-25 (thre" 0x0000000000000000 in ?? ()
  30   Thread 0x7fffb2ffd6c0 (LWP 53910) "Thread-29 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  31   Thread 0x7fffb27fc6c0 (LWP 53911) "Thread-30 (thre" 0x0000000000000000 in ?? ()
  35   Thread 0x7fffabfff6c0 (LWP 53915) "Thread-34 (thre" 0x0000000000000000 in ?? ()
* 41   Thread 0x7fffa8ff96c0 (LWP 53921) "Thread-40 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  42   Thread 0x7fffa87f86c0 (LWP 53922) "Thread-41 (thre" 0x0000000000661e10 in PyThreadState_GetFrame ()
  44   Thread 0x7fffa77f66c0 (LWP 53924) "Thread-43 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
  45   Thread 0x7fffa6ff56c0 (LWP 53925) "Thread-44 (thre" 0x0000000000661e10 in PyThreadState_GetFrame ()
  46   Thread 0x7fffa67f46c0 (LWP 53926) "Thread-45 (thre" 0x0000000000661e10 in PyThreadState_GetFrame ()
  50   Thread 0x7fffa47f06c0 (LWP 53930) "Thread-49 (thre" 0x00000000007f2d19 in ?? ()
  53   Thread 0x7fffa2fed6c0 (LWP 53933) "Thread-52 (thre" 0x00000000007f2d19 in ?? ()
  54   Thread 0x7fffa27ec6c0 (LWP 53934) "Thread-53 (thre" 0x00007ffff77ee76b in slp_switch ()
    at src/greenlet/platform/switch_amd64_unix.h:58
(gdb) bt
#0  0x00007ffff77ee76b in slp_switch () at src/greenlet/platform/switch_amd64_unix.h:58
#1  0x00007ffff77ee970 in greenlet::Greenlet::g_switchstack (this=0x7fffb4001590) at src/greenlet/TGreenlet.cpp:183
#2  0x00007ffff77ef0e0 in greenlet::UserGreenlet::g_switch (this=0x7fffb4001590) at src/greenlet/TUserGreenlet.cpp:155
#3  0x00007ffff77e8155 in greenlet::Greenlet::throw_GreenletExit_during_dealloc (this=this@entry=0x7fffb4001590, 
    UNUSED_current_thread_state=...) at src/greenlet/TGreenlet.cpp:68
#4  0x00007ffff77eb145 in greenlet::UserGreenlet::throw_GreenletExit_during_dealloc (this=0x7fffb4001590, 
    current_thread_state=...) at src/greenlet/TUserGreenlet.cpp:94
#5  0x00007ffff77f0ae8 in greenlet::Greenlet::deallocing_greenlet_in_thread (this=0x7fffb4001590, 
    current_thread_state=0x7fffb4001690) at src/greenlet/TGreenlet.cpp:554
#6  0x00007ffff77f0d3b in _green_dealloc_kill_started_non_main_greenlet (self=...) at src/greenlet/PyGreenlet.cpp:205
#7  green_dealloc (self=0x2bd380e0180) at src/greenlet/PyGreenlet.cpp:284
#8  0x0000000000548012 in ?? ()
#9  0x00000000005211da in _Py_Dealloc ()
#10 0x0000000000631ef0 in _Py_HandlePending ()
#11 0x00000000004281dc in _PyEval_EvalFrameDefault ()
#12 0x00000000005f46ce in ?? ()
#13 0x000000000049e7b9 in ?? ()
#14 0x00000000004a68c8 in ?? ()
#15 0x0000000000613a03 in ?? ()
#16 0x000000000049e893 in PyObject_Vectorcall ()
#17 0x00000000004280b6 in _PyEval_EvalFrameDefault ()
#18 0x00000000005f46ce in ?? ()
#19 0x000000000049e7b9 in ?? ()
#20 0x00000000004a68c8 in ?? ()
#21 0x0000000000798381 in ?? ()
#22 0x000000000067c3d7 in ?? ()
#23 0x00007ffff7d0daa4 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:447
#24 0x00007ffff7d9ac6c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

@jamadden
Copy link
Contributor

Again, I'm not going to add 3.15 at this time. Please don't open pull requests containing other people's work (partly uncredited in this case). Please don't try to sneak commits in that I've already rejected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants